home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2008 February / PCWFEB08.iso / Software / Freeware / Miro 1.0 / Miro_Installer.exe / Miro_Downloader.exe / folder.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2007-11-12  |  10.4 KB  |  298 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.5)
  3.  
  4. from gtcache import gettext as _
  5. import app
  6. import dialogs
  7. import indexes
  8. import menu
  9. import playlist
  10. import sorts
  11. import util
  12. import views
  13. from database import DDBObject
  14. from databasehelper import makeSimpleGetSet
  15.  
  16. class FolderBase(DDBObject):
  17.     '''Base class for ChannelFolder and Playlist folder classes.'''
  18.     
  19.     def __init__(self, title):
  20.         self.title = title
  21.         self.expanded = True
  22.         DDBObject.__init__(self)
  23.  
  24.     (getTitle, setTitle) = makeSimpleGetSet('title')
  25.     
  26.     def getExpanded(self):
  27.         self.confirmDBThread()
  28.         return self.expanded
  29.  
  30.     
  31.     def setExpanded(self, newExpanded):
  32.         self.confirmDBThread()
  33.         self.expanded = newExpanded
  34.         self.signalChange()
  35.         for child in self.getChildrenView():
  36.             child.signalChange(needsSave = False)
  37.         
  38.  
  39.     
  40.     def getNextTab(self):
  41.         """Get the first tab that isn't in this folder our.  If there are no
  42.         items afterwards, return None.
  43.         """
  44.         anchorItem = None
  45.         seenSelf = False
  46.         for tab in self.getTabOrder().getView():
  47.             if not seenSelf and tab.obj is self:
  48.                 seenSelf = True
  49.                 continue
  50.             if seenSelf and tab.obj.getFolder() is not self:
  51.                 return tab.obj
  52.                 continue
  53.         
  54.         return None
  55.  
  56.     
  57.     def handleDNDAppend(self, draggedIDs):
  58.         tabOrder = self.getTabOrder()
  59.         for id in draggedIDs:
  60.             tab = tabOrder.tabView.getObjectByID(id)
  61.             tab.obj.setFolder(self)
  62.         
  63.         tabOrder.moveTabs(self.getNextTab(), draggedIDs)
  64.         selection = app.controller.selection.tabListSelection
  65.         if len(selection.currentSelection) == 0:
  66.             app.controller.selection.selectItem('tablist', tabOrder.tabView, self.getID(), False, False)
  67.         
  68.         self.signalChange()
  69.  
  70.     
  71.     def rename(self):
  72.         
  73.         def callback(dialog):
  74.             if self.idExists() and dialog.choice == dialogs.BUTTON_OK:
  75.                 self.setTitle(dialog.value)
  76.             
  77.  
  78.         dialogs.TextEntryDialog(self.renameTitle(), self.renameText(), dialogs.BUTTON_OK, dialogs.BUTTON_CANCEL).run(callback)
  79.  
  80.     
  81.     def remove(self, moveItemsTo = None):
  82.         children = [ child for child in self.getChildrenView() ]
  83.         for child in children:
  84.             child.remove(moveItemsTo)
  85.         
  86.         DDBObject.remove(self)
  87.  
  88.     
  89.     def getFolder(self):
  90.         pass
  91.  
  92.     
  93.     def setFolder(self, newFolder):
  94.         if newFolder is not None:
  95.             raise TypeError('Nested folders not allowed')
  96.         
  97.  
  98.     
  99.     def renameTitle(self):
  100.         '''Return the title to use for the rename dialog'''
  101.         raise NotImplementedError()
  102.  
  103.     
  104.     def renameText(self):
  105.         '''Return the description text to use for the rename dialog'''
  106.         raise NotImplementedError()
  107.  
  108.     
  109.     def getTabOrder(self):
  110.         '''Return the TabOrder object that this folder belongs to.'''
  111.         raise NotImplementedError()
  112.  
  113.     
  114.     def getChildrenView(self):
  115.         '''Return the children of this folder.'''
  116.         raise NotImplementedError()
  117.  
  118.  
  119.  
  120. class ChannelFolder(FolderBase):
  121.     
  122.     def __init__(self, title):
  123.         FolderBase.__init__(self, title)
  124.         self._initRestore()
  125.  
  126.     
  127.     def onRestore(self):
  128.         self._initRestore()
  129.  
  130.     
  131.     def _initRestore(self):
  132.         self.itemSort = sorts.ItemSort()
  133.         self.itemSortDownloading = sorts.ItemSort()
  134.         self.itemSortWatchable = sorts.ItemSortUnwatchedFirst()
  135.  
  136.     
  137.     def renameTitle(self):
  138.         return _('Rename Channel Folder')
  139.  
  140.     
  141.     def renameText(self):
  142.         return _('Enter a new name for the channel folder %s' % self.getTitle())
  143.  
  144.     
  145.     def getTabOrder(self):
  146.         return util.getSingletonDDBObject(views.channelTabOrder)
  147.  
  148.     
  149.     def getChildrenView(self):
  150.         return views.feeds.filterWithIndex(indexes.byFolder, self)
  151.  
  152.     
  153.     def hasDownloadedItems(self):
  154.         for feed in self.getChildrenView():
  155.             if feed.hasDownloadedItems():
  156.                 return True
  157.                 continue
  158.         
  159.         return False
  160.  
  161.     
  162.     def hasDownloadingItems(self):
  163.         for feed in self.getChildrenView():
  164.             if feed.hasDownloadingItems():
  165.                 return True
  166.                 continue
  167.         
  168.         return False
  169.  
  170.     
  171.     def makeContextMenu(self, templateName, view):
  172.         return menu.makeMenu([
  173.             ((self.rename, _('Rename Channel Folder')),),
  174.             ((lambda : app.controller.removeFeed(self)), _('Remove'))])
  175.  
  176.     
  177.     def showU(self):
  178.         return self.numUnwatched() > 0
  179.  
  180.     
  181.     def numUnwatched(self):
  182.         unwatched = 0
  183.         for child in self.getChildrenView():
  184.             if child.showU():
  185.                 unwatched += child.numUnwatched()
  186.                 continue
  187.         
  188.         return unwatched
  189.  
  190.     
  191.     def showA(self):
  192.         return self.numAvailable() > 0
  193.  
  194.     
  195.     def numAvailable(self):
  196.         available = 0
  197.         for child in self.getChildrenView():
  198.             if child.showA():
  199.                 available += child.numAvailable()
  200.                 continue
  201.         
  202.         return available
  203.  
  204.  
  205.  
  206. class PlaylistFolder(FolderBase, playlist.PlaylistMixin):
  207.     
  208.     def __init__(self, title):
  209.         self.item_ids = []
  210.         self.setupTrackedItemView()
  211.         FolderBase.__init__(self, title)
  212.  
  213.     
  214.     def onRestore(self):
  215.         self.setupTrackedItemView()
  216.  
  217.     
  218.     def handleDNDAppend(self, draggedIDs):
  219.         FolderBase.handleDNDAppend(self, draggedIDs)
  220.         for id in draggedIDs:
  221.             tab = self.getTabOrder().tabView.getObjectByID(id)
  222.             for item in tab.obj.getView():
  223.                 if item.getID() not in self.trackedItems:
  224.                     self.trackedItems.appendID(item.getID())
  225.                     continue
  226.             
  227.         
  228.         self.signalChange()
  229.  
  230.     
  231.     def checkItemIDRemoved(self, id):
  232.         index = indexes.playlistsByItemAndFolderID
  233.         value = (id, self.getID())
  234.         view = views.playlists.filterWithIndex(index, value)
  235.         if view.len() == 0 and id in self.trackedItems:
  236.             self.removeID(id)
  237.         
  238.  
  239.     
  240.     def makeContextMenu(self, templateName, view):
  241.         return menu.makeMenu([
  242.             ((self.rename, _('Rename Playlist Folder')),),
  243.             ((lambda : app.controller.removePlaylist(self)), _('Remove'))])
  244.  
  245.     
  246.     def renameTitle(self):
  247.         return _('Rename Playlist Folder')
  248.  
  249.     
  250.     def renameText(self):
  251.         return _('Enter a new name for the playlist folder %s' % self.getTitle())
  252.  
  253.     
  254.     def getTabOrder(self):
  255.         return util.getSingletonDDBObject(views.playlistTabOrder)
  256.  
  257.     
  258.     def getChildrenView(self):
  259.         return views.playlists.filterWithIndex(indexes.byFolder, self)
  260.  
  261.  
  262.  
  263. def createNewChannelFolder(childIDs = None):
  264.     title = _('Create Channel Folder')
  265.     description = _('Enter a name for the new channel folder')
  266.     
  267.     def callback(dialog):
  268.         if dialog.choice == dialogs.BUTTON_CREATE:
  269.             folder = ChannelFolder(dialog.value)
  270.             app.controller.selection.selectTabByObject(folder)
  271.             if childIDs:
  272.                 folder.handleDNDAppend(childIDs)
  273.             
  274.         
  275.  
  276.     dialogs.TextEntryDialog(title, description, dialogs.BUTTON_CREATE, dialogs.BUTTON_CANCEL).run(callback)
  277.  
  278.  
  279. def createNewPlaylistFolder(childIDs = None):
  280.     title = _('Create Playlist Folder')
  281.     description = _('Enter a name for the new playlist folder')
  282.     
  283.     def callback(dialog):
  284.         if dialog.choice == dialogs.BUTTON_CREATE:
  285.             folder = PlaylistFolder(dialog.value)
  286.             app.controller.selection.selectTabByObject(folder)
  287.             if childIDs:
  288.                 folder.handleDNDAppend(childIDs)
  289.             
  290.         
  291.  
  292.     dialogs.TextEntryDialog(title, description, dialogs.BUTTON_CREATE, dialogs.BUTTON_CANCEL).run(callback)
  293.  
  294.  
  295. def getFolderByTitle(title):
  296.     return views.channelFolders.getItemWithIndex(indexes.foldersByTitle, title)
  297.  
  298.